﻿#define  _CRT_SECURE_NO_WARNINGS
#include<iostream>
using  namespace std;
//class Time
//{
//public:
//	Time(int hour = 0)
//		:_hour(hour)
//	{
//		cout << "Time()" << endl;
//	}
//private:
//	int _hour;
//};
//class Date
//{
//public:
//	Date(int day)
//	{}
//private:
//	int _day;
//	Time _t;
//};
//int main()
//{
//	Date d(1);
////}
//
//
//class A
//{
//public:
//	A(int a)
//		:_a1(a)
//		, _a2(_a1)
//	{}
//
//	void Print() {
//		cout << _a1 << " " << _a2 << endl;
//	}
//private:
//	int _a2;
//	int _a1;
//};
//int main() {
//	A aa(1);
//	aa.Print();
//}


//class Date
//{
//public:
//	// 1. 单参构造函数，没有使用explicit修饰，具有类型转换作用
//	 // explicit修饰构造函数，禁止类型转换---explicit去掉之后，代码可以通过编译
//	explicit Date(int year)
//		:_year(year)
//	{}
//	
//	// 2. 虽然有多个参数，但是创建对象时后两个参数可以不传递，没有使用explicit修饰，具有类型转换作用
//	// explicit修饰构造函数，禁止类型转换
//	/*explicit Date(int year, int month = 1, int day = 1)
//	: _year(year)
//	, _month(month)
//	, _day(day)
//	{}*/
//	
//	Date& operator=(const Date& d)
//	{
//		if (this != &d)
//		{
//			_year = d._year;
//			_month = d._month;
//			_day = d._day;
//		}
//		return *this;
//	}
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//int main()
//{
//	Date d1(2022);
//	// 用一个整形变量给日期类型对象赋值
//	// 实际编译器背后会用2023构造一个无名对象，最后用无名对象给d1对象进行赋值
//	d1 = 2023;
//	// 将1屏蔽掉，2放开时则编译失败，因为explicit修饰构造函数，禁止了单参构造函数类型转换的作用
//}
//
//
//class A
//{
//public:
//	A() { ++_scount; }
//	A(const A& t) { ++_scount; }
//	~A() { --_scount; }
//	static int GetACount() { return _scount; }
//private:
//	static int _scount;
//};
//int A::_scount = 0;
//void TestA()
//{
//	cout << A::GetACount() << endl;
//	A a1, a2;
//	A a3(a1);
//	cout << A::GetACount() << endl;
//}
//
//
//
//class Time
//{
//	friend class Date; 
//	
//public:
//	Time(int hour = 0, int minute = 0, int second = 0)
//		: _hour(hour)
//		, _minute(minute)
//		, _second(second)
//	{}
//
//private:
//	int _hour;
//	int _minute;
//	int _second;
//};
//class Date
//{
//public:
//	Date(int year = 1900, int month = 1, int day = 1)
//		: _year(year)
//		, _month(month)
//		, _day(day)
//	{}
//
//	void SetTimeOfDate(int hour, int minute, int second)
//	{
//		// 直接访问时间类私有的成员变量
//		_t._hour = hour;
//		_t._minute = minute;
//		_t._second = second;
//	}
//
//private:
//	int _year;
//	int _month;
//	int _day;
//	Time _t;
//};
//
//
//
//
//
//
//
//int main()
//{
//	
//	return 0;
//}

class A
{
public:
    A(int a)
        :_a(a)
    {
        cout << "A(int a = 0)" << endl;
    }
private:
    int _a;
};

namespace bit
{
    class Date
    {
    public:
        //Date(int year, int month, int day)
        //{
        //    // 函数体内初始化
        //    _year = year;
        //    _month = month;
        //    _day = day;

        //    //_ref = year;
        //    //_n = 1;
        //}

        //Date(int year, int month, int day)
        //    :_year(year)
        //    ,_month(month)
        //    ,_day(day)
        //    ,_ref(year)
        //    ,_n(1)
        //{
        //    // 初始化列表
        //    // 
        //}

        Date(int year, int month, int day)
           :_year(2)
           ,_ref(year)
           ,_n(1)
           ,_aa(10)
        {
            // 剩下3个成员没有在初始化列表显示写出来定义
            // 但是他也会定义，只是内置类型默认给的随机值
            // 如果是自定义类型成员会去调用它的默认构造函数
            
            // 函数体内初始化
            _year = year;
            _month = month;
            _day = day;
        }

    private:
        // 声明
        int _year ; // 缺省值
        int _month;
        int _day;

        A _aa;        // 定义类型成员(且该类没有默认构造函数时)

        int& _ref;	  // 引用 ： 必须在定义的时候初始化
        const int _n; // const ： 必须在定义的时候初始化
    };
}


int main()
{
    // 定义：对象整体定义
    // 每个成员变量在什么地方定义呢？->初始化列表
    bit::Date d1(2023, 10, 31);

    }